package com.jcode.skeleton.web;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.jcode.skeleton.exception.BizException;

/**
 * 网关转发控制器
 *
 * @Author dreajay
 * @DateTime 2017年3月27日 下午2:37:54
 *
 */
@Controller
@Validated
public class GatewayDispatchController {

	private static Logger logger = LoggerFactory.getLogger(GatewayDispatchController.class);

	/**
	 * 仅做请求的转发<br/>
	 * 权限校验、参数校验在拦截器{@code }中处理<br/>
	 * 
	 * @param ott_token
	 *            合作伙伴ID
	 * @param opt
	 *            API名称
	 * @param timestamp
	 *            请求时间戳
	 * @param sign
	 *            签名，算法:MD5(ott_token+timestamp+secret),注意+是拼接符，
	 *            secret是分配给合作伙伴的秘钥
	 * @param bizContent
	 *            业务参数的json形式的字符串
	 * @param request
	 *            http请求对象
	 * @param response
	 *            http响应对象
	 * @throws ServletException
	 * @throws IOException
	 * @throws BizException
	 */
	@RequestMapping("/gateway")
	public void gatewayDispatch(//
			@RequestParam("ott_token") String ott_token, //
			@RequestParam("api") String api, //
			@RequestParam("timestamp") String timestamp, //
			@RequestParam("sign") String sign, //
			@RequestParam(name = "bizContent", required = false) String bizContent, //
			HttpServletRequest request, //
			HttpServletResponse response) throws ServletException, IOException {

		logger.info("gatewayDispatch ott_token={} opt={} timestamp={} sign={} bizContent={}", ott_token, api, timestamp, sign, bizContent);

		// 供内部调用的接口，不需要校验公共参数or都当做合作伙伴去调用，即通过判别接口名或者合作伙伴ID来区分对内对外；亦可通过请求路径来区分，只要走/gateway的都要校验，其他的不需要

		// Assert.hasText(ott_token,"调用方合作伙伴ID不能为空");
		// Assert.hasText(opt,"API接口名称不能为空");
		// Assert.hasText(timestamp,"请求时间戳不能为空");
		// Assert.hasText(sign,"签名不能为空");
		// Assert.hasText(bizContent,"业务参数不能为空");//业务参数采用json形式的post上传

		// TODO 时间戳不能与当前时间相差太大，暂定30分钟，否则有可能用历史签名伪造请求的

		// TODO 取出合作伙伴的秘钥后再按算法校验签名
		// Assert.assertEquals("仅支持泰一对接",
		// SystemProperties.AD_OTT_TOKEN_NAME_TAIYI(), ott_token);

		// Assert.assertNotNull("合作伙伴不能为空", timestamp);

		request.getRequestDispatcher(api).forward(request, response);
	}

}
